package com.knowledge.plus.泛型.通配符;

import java.util.ArrayList;

/**
 * @author TPF
 * @since 2023/7/27
 */
public class 无限定通配符 {

    /**
     * 无界通配符<?>：? 代表了任何一种数据类型，能代表任何一种数据类型的只有 null
     * <?> 也是一个数据类型实参，它和 Number、String、Integer 一样都是一种实际的数据类型。
     */
    public void genericTypeUsage() {
        ArrayList<Integer> list01 = new ArrayList<>();
        list01.add(123);
        list01.add(456);
        ArrayList<?> list02 = list01; // 安全地向上转型

        /*
         * ArrayList<?> 既没有上界也没有下界，因此，它可以代表所有数据类型的某一个集合，但我们不能指定 ArrayList<?> 的数据类型
         *
         * ArrayList<?> 集合的数据类型是不确定的，因此我们只能往集合中添加 null；
         * 而我们从 ArrayList<?> 集合中取出的元素，也只能赋值给 Object 对象，不然会产生ClassCastException 异常（原因可以结合上界和下界通配符理解）。
         */
        ArrayList<?> list = new ArrayList<>();
        list.add(null); // 编译正确
        Object obj = list.get(0);   // 编译正确

        // list.add(new Integer(1));   // 编译错误
        // Integer num = list.get(0);  // 编译错误
    }

}
